"""
Agno AkShare 投资智能体系统主程序

基于Agno框架和AkShare数据接口的AI投资决策系统
"""

import os
import sys
import argparse
import logging
import atexit
import signal
from datetime import datetime, timedelta
from typing import Optional
from dotenv import load_dotenv

# 添加项目根目录到Python路径
sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))

from src.agents.market_data_agent import MarketDataAgent
from src.agents.technical_analyst_agent import TechnicalAnalystAgent
from src.agents.fundamental_analyst_agent import FundamentalAnalystAgent
from src.agents.sentiment_analyst_agent import SentimentAnalystAgent
from src.agents.valuation_analyst_agent import ValuationAnalystAgent

# 加载环境变量
load_dotenv()

# 配置日志
logging.basicConfig(
    level=logging.INFO,
    format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
    handlers=[
        logging.FileHandler('logs/investment_agent.log'),
        logging.StreamHandler()
    ]
)

logger = logging.getLogger(__name__)


def cleanup_on_exit():
    """程序退出时的清理函数"""
    try:
        # 强制刷新所有输出缓冲区
        sys.stdout.flush()
        sys.stderr.flush()

        # 给Rich库一些时间完成清理
        import time
        time.sleep(0.1)
    except:
        pass  # 忽略清理过程中的任何错误


def signal_handler(signum, frame):
    """信号处理函数"""
    logger.info("收到退出信号，正在清理...")
    cleanup_on_exit()
    sys.exit(0)


# 注册退出处理函数
atexit.register(cleanup_on_exit)
signal.signal(signal.SIGINT, signal_handler)
signal.signal(signal.SIGTERM, signal_handler)


class InvestmentAnalysisSystem:
    """投资分析系统主类"""
    
    def __init__(self, model_id: str = "deepseek-chat"):
        """
        初始化投资分析系统
        
        Args:
            model_id: LLM模型ID
        """
        self.model_id = model_id
        
        # 初始化各个智能体
        logger.info("正在初始化投资分析系统...")

        # 基础分析智能体
        self.market_data_agent = MarketDataAgent(model_id)#市场数据
        self.technical_analyst = TechnicalAnalystAgent(model_id)#技术分析
        self.fundamental_analyst = FundamentalAnalystAgent(model_id)#基本面分析
        self.sentiment_analyst = SentimentAnalystAgent(model_id)#情绪分析

        # 高级分析智能体
        self.valuation_analyst = ValuationAnalystAgent(model_id)#估值分析
        # self.researcher_bull = ResearcherBullAgent(model_id)#多头研究
        # self.researcher_bear = ResearcherBearAgent(model_id)#空头研究
        # self.debate_room = DebateRoomAgent(model_id)#辩论室

        # # 宏观分析智能体
        # self.macro_analyst = MacroAnalystAgent(model_id)#宏观分析
        # self.macro_news_agent = MacroNewsAgent(model_id)#宏观新闻

        # # 风险和组合管理智能体
        # self.risk_manager = RiskManagerAgent(model_id)#风险管理
        # self.portfolio_manager = PortfolioManagerAgent(model_id)#投资组合管理

        logger.info("投资分析系统初始化完成")
    
    def run_full_investment_analysis(
        self,
        ticker: str,
        start_date: Optional[str] = None,
        end_date: Optional[str] = None,
        news_count: int = 10,
        portfolio_value: float = 1000000.0,
        show_reasoning: bool = False
    ) -> str:
        """
        运行完整投资分析流程（包含所有智能体）

        Args:
            ticker: 股票代码
            portfolio_value: 投资组合价值
            show_reasoning: 是否显示详细推理过程

        Returns:
            str: 完整分析报告
        """
        try:
            logger.info(f"开始对股票 {ticker} 进行完整投资分析")
             # 设置默认日期
            if not end_date:
                end_date = datetime.now().strftime("%Y-%m-%d")
            if not start_date:
                start_date = (datetime.now() - timedelta(days=240)).strftime("%Y-%m-%d")
            
            # 转换日期格式为AkShare需要的格式
            start_date_ak = start_date.replace("-", "")
            end_date_ak = end_date.replace("-", "")

            print(f"\n🚀 启动完整投资分析流程: {ticker}")
            print(f"💰 投资组合价值: ¥{portfolio_value:,.2f}")
            print("=" * 80)

            # 第一阶段：基础数据收集和分析
            print(f"\n🔍 【第一阶段】基础数据收集和分析")
            print("-" * 50)
            print(f"开始日期: {start_date_ak}")
            print(f"结束日期: {end_date_ak}")
            print(f"新闻数量: {news_count}")

            # 1. 市场数据收集
            print(f"\n📊 1. 市场数据收集...")
            data_collection_message = f"请收集股票 {ticker} 从 {start_date_ak} 到 {end_date_ak} 的完整市场数据，包括 {news_count} 条新闻"
            if show_reasoning:
                self.market_data_agent.print_response(data_collection_message, stream=True)
            else:
                market_data = self.market_data_agent.run(data_collection_message)
                print("✅ 市场数据收集完成")

            # 获取收集的数据
            collected_data = self.market_data_agent.get_collected_data(ticker)
            # 保存数据到本地文件
            self._save_collected_data_to_file(ticker, collected_data, f"market_data_agent_data_{ticker}_latest.json")

            # 2. 技术分析
            print(f"\n📈 2. 技术分析...")
            if show_reasoning:
                self.technical_analyst.print_response(f"对股票 {ticker} 进行技术分析", stream=True)
            else:
                technical_result = self.technical_analyst.run(f"对股票 {ticker} 进行技术分析")
                print("✅ 技术分析完成")

            # 获取技术分析结果
            technical_result = self.technical_analyst.get_analysis_result(ticker)
            # 保存技术分析结果到本地文件
            self._save_collected_data_to_file(ticker, technical_result, f"technical_analysis_agent_data_{ticker}_latest.json")

            # # 3. 基本面分析
            # print(f"\n💰 3. 基本面分析...")
            # if show_reasoning:
            #     self.fundamental_analyst.print_response(f"对股票 {ticker} 进行基本面分析", stream=True)
            # else:
            #     fundamental_result = self.fundamental_analyst.run(f"对股票 {ticker} 进行基本面分析")
            #     print(fundamental_result)
            #     print('-'*100)
            #     print("✅ 基本面分析完成")

            # fundamental_result = self.fundamental_analyst.get_analysis_result(ticker)
            # self._save_collected_data_to_file(ticker, fundamental_result, f"fundamental_analysis_agent_data_{ticker}_latest.json")

            # # 4. 情绪分析
            # print(f"\n😊 4. 情绪分析...")
            # if show_reasoning:
            #     self.sentiment_analyst.print_response(f"对股票 {ticker} 进行情绪分析", stream=True)
            # else:
            #     sentiment_result = self.sentiment_analyst.run(f"对股票 {ticker} 进行情绪分析")
            #     print("✅ 情绪分析完成")

            # sentiment_result = self.sentiment_analyst.get_analysis_result(ticker)
            # # print(sentiment_result)
            # # #情绪分析暂时先不存到json，我要考虑一下是存sentiment_result还是LLM的response
            # # print('-'*100)
            # self._save_collected_data_to_file(ticker, sentiment_result, f"sentiment_analysis_agent_data_{ticker}_latest.json")

            # 第二阶段：深度分析
            print(f"\n🔬 【第二阶段】深度分析")
            print("-" * 50)

            # # 5. 估值分析
            # print(f"\n💎 5. 估值分析...")
            # if show_reasoning:
            #     self.valuation_analyst.print_response(f"对股票 {ticker} 进行估值分析", stream=True)
            # else:
            #     valuation_result = self.valuation_analyst.run(f"对股票 {ticker} 进行估值分析")
            #     print("✅ 估值分析完成")

            # valuation_result = self.valuation_analyst.get_analysis_result(ticker)
            # self._save_collected_data_to_file(ticker, valuation_result, f"valuation_analysis_agent_data_{ticker}_latest.json")
            # # print(valuation_result)
            # # print('-'*100)


            # # 生成最终报告
            # print(f"\n📋 【最终报告】")
            # print("=" * 80)

#             final_report = f"""
# 🎯 **{ticker} 完整投资分析报告**

# 📅 **分析时间**: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}
# 💰 **投资组合价值**: ¥{portfolio_value:,.2f}

# 🔍 **分析完成情况**:
# ✅ 市场数据收集
# ✅ 技术分析
# ✅ 基本面分析
# ✅ 情绪分析
# ✅ 估值分析
# ✅ 多头研究
# ✅ 空头研究
# ✅ 多空辩论
# ✅ 宏观分析
# ✅ 宏观新闻分析
# ✅ 风险评估
# ✅ 投资决策

# 💡 **综合建议**: 请查看上述各阶段的详细分析结果

# ⚠️ **重要提示**:
# - 本分析基于Agno智能体框架和AkShare数据接口
# - 分析结果仅供参考，不构成投资建议
# - 投资有风险，决策需谨慎
# - 请结合自身情况做出最终投资决策

# 📊 **系统信息**:
# - 分析框架: Agno智能体框架
# - 数据来源: AkShare金融数据接口
# - 模型版本: {self.model_id}
# - 智能体数量: 12个专业智能体
# """

            # print(final_report)

            logger.info(f"股票 {ticker} 完整投资分析完成")
            # return final_report
            return "完整投资分析完成"

        except Exception as e:
            error_msg = f"完整投资分析失败: {str(e)}"
            logger.error(error_msg)
            print(f"\n❌ {error_msg}")
            return error_msg
    
   
    def  _save_collected_data_to_file(self, ticker: str, collected_data: dict, filename: str):
        """
        将收集的数据保存到本地文件

        Args:
            ticker: 股票代码
            collected_data: 收集的数据
        """
        import json
        import os
        from datetime import datetime

        try:
            if not collected_data:
                logger.warning(f"股票 {ticker} 没有收集到数据，跳过保存")
                return

            # 创建数据目录
            data_dir = "data/collected_data"
            if not os.path.exists(data_dir):
                os.makedirs(data_dir)

            # latest_filename = f"market_data_agent_data_{ticker}_latest.json"
            latest_file_path = os.path.join(data_dir, filename)
            with open(latest_file_path, "w", encoding="utf-8") as f:
                json.dump(collected_data, f, ensure_ascii=False, indent=2, default=str)

            print(f"✅ 最新数据已保存到: {latest_file_path}")

        except Exception as e:
            error_msg = f"保存数据到文件失败: {str(e)}"
            logger.error(error_msg)
            print(f"❌ {error_msg}")


def main():
    """主函数"""
    parser = argparse.ArgumentParser(description="Agno AkShare 投资智能体系统")
    parser.add_argument("--ticker", type=str, help="股票代码")
    parser.add_argument("--start-date", type=str, help="开始日期 (YYYY-MM-DD)")
    parser.add_argument("--end-date", type=str, help="结束日期 (YYYY-MM-DD)")
    parser.add_argument("--num-of-news", type=int, default=10, help="新闻分析数量")
    parser.add_argument("--show-reasoning", action="store_true", help="显示详细推理过程")
    parser.add_argument("--interactive", action="store_true", help="交互模式")
    parser.add_argument("--model", type=str, default="deepseek-chat", help="LLM模型ID")
    parser.add_argument("--full-analysis", action="store_true", help="运行完整投资分析（12个智能体）")
    parser.add_argument("--portfolio-value", type=float, default=1000000.0, help="投资组合价值")
    
    args = parser.parse_args()
    
    # 确保日志目录存在
    os.makedirs("logs", exist_ok=True)
    os.makedirs("data", exist_ok=True)
    # 初始化系统
    system = InvestmentAnalysisSystem(model_id=args.model)
    
    if args.interactive:
        # 交互模式
        system.run_interactive_mode()
    elif args.ticker:
        # 命令行模式
        if args.full_analysis:
            # 完整投资分析
            system.run_full_investment_analysis(
                ticker=args.ticker,
                portfolio_value=args.portfolio_value,
                show_reasoning=args.show_reasoning
            )
        else:
            # 基础综合分析
            # system.run_comprehensive_analysis(
            #     ticker=args.ticker,
            #     start_date=args.start_date,
            #     end_date=args.end_date,
            #     news_count=args.num_of_news,
            #     show_reasoning=args.show_reasoning
            # )
    else:
        # 默认进入交互模式
        system.run_interactive_mode()


if __name__ == "__main__":
    try:
        main()
    except KeyboardInterrupt:
        logger.info("用户中断程序")
        cleanup_on_exit()
        sys.exit(0)
    except Exception as e:
        logger.error(f"程序执行出错: {str(e)}")
        cleanup_on_exit()
        sys.exit(1)
    finally:
        # 确保程序正常退出时也执行清理
        cleanup_on_exit()

# 接下来对前五个智能体整合工作流